package com.cloud.mkz.core.common.util;

import cn.hutool.core.util.StrUtil;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.util.Calendar;

@UtilityClass
@Slf4j
public class FileUtil {
	/**
	 * 获取文件上传的根路径
	 * @param fileType 文件类别
	 * @return
	 */
	public String getBasePath(String fileType) {
		Calendar cl = Calendar.getInstance();
		int month = cl.get(Calendar.MONTH)+1;
		String monthStr = month+"";
		if(month<10) {
			monthStr = "0"+month;
		}
		int day = cl.get(Calendar.DATE);
		String dayStr = day+"";
		if(day<10) {
			dayStr = "0"+day;
		}
		return "upload"+File.separator+cl.get(Calendar.YEAR)+File.separator+monthStr+File.separator+dayStr+File.separator+fileType;
	}
	/**
	 * 根据文件路径获取文件名称
	 * @param filePath 文件路径
	 * @return 
	 */
	public String getFilename(String filePath) {
		if(StrUtil.isEmpty(filePath)) {
			return null;
		}
		if(filePath.indexOf("\\")<1&&filePath.indexOf("/")<1) {
			return null;
		}
		String fileName = filePath.substring(filePath.lastIndexOf("\\")+1);
		if(filePath.indexOf("\\")<filePath.indexOf("/")) {
			fileName = filePath.substring(filePath.lastIndexOf("/")+1);
		}
		if(StrUtil.isEmpty(fileName)) {
			return null;
		}
		return fileName;
	}
	/**
	 * 根据文件路径获取文件后缀名
	 * @param filePath 文件路径
	 * @return 
	 */
	public String getFileSuffix(String filePath) {
		if(StrUtil.isEmpty(filePath)) {
			return null;
		}
		if(filePath.indexOf("\\")<1&&filePath.indexOf("/")<1) {
			return null;
		}
		String fileName = filePath.substring(filePath.lastIndexOf("\\")+1);
		if(filePath.indexOf("\\")<filePath.indexOf("/")) {
			fileName = filePath.substring(filePath.lastIndexOf("/")+1);
		}
		String Suffix = null;
		if(StrUtil.isEmpty(fileName)) {
			return null;
		}else {
			Suffix = fileName.substring(fileName.lastIndexOf("."));
			if(StrUtil.isEmpty(Suffix)) {
				return null;
			}
		}
		return Suffix;
	}
	/**
	 * 指定位置开始读取指定长度的字节流
	 * @param startPosition
	 * @param endPosition
	 * @param filePath
	 * @return
	 */
	public byte[] randomReadFile(long startPosition, long endPosition, String filePath) throws Exception {
		if (endPosition < startPosition) {
			throw new Exception("起始地址不能大于结束位置.");
		}
		RandomAccessFile randomFile = new RandomAccessFile(filePath, "r");
		int size = (int)(endPosition-startPosition);
		byte[] bytes = new byte[size];
		randomFile.seek(startPosition);
		randomFile.read(bytes);
		randomFile.close();
		return bytes;
	}
	//获取文件SHA1摘要值
	public static String getFileSHA1(String filepath){
		File thefile = new File(filepath);
		if(thefile.exists()&&thefile.isFile()){
			InputStream fileInputStream = null;
			try {
				fileInputStream = new FileInputStream(thefile);
			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			}
	        int bufferSize = 256 * 1024;
	        DigestInputStream digestInputStream = null;
	        try{
	           // 拿到一个SHA1转换器（这里可以换成MD5）
	           MessageDigest messageDigest =MessageDigest.getInstance("SHA1");
	           // 使用DigestInputStream
	           digestInputStream = new DigestInputStream(fileInputStream,messageDigest);
	           // read的过程中进行SHA1处理，直到读完文件
	           byte[] buffer =new byte[bufferSize];
	           while (digestInputStream.read(buffer) > 0);
	           // 获取最终的MessageDigest
	           messageDigest= digestInputStream.getMessageDigest();
	           // 拿到结果，也是字节数组，包含16个元素
	           byte[] resultByteArray = messageDigest.digest();
	           // 把字节数组转换成字符串
	           return byteArrayToHex(resultByteArray);
	        }catch(Exception e) {
	           return null;  
	        }finally{
	           try{
	              digestInputStream.close();
	              fileInputStream.close();
	           }catch (Exception e) {
	           }
	        }
		}else{
			return null;
		}
	}
		//将字节数组换成成16进制的字符串
	public static String byteArrayToHex(byte[] byteArray) {
        // 首先初始化一个字符数组，用来存放每个16进制字符
        char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F' };
        // new一个字符数组，这个就是用来组成结果字符串的（解释一下：一个byte是八位二进制，也就是2位十六进制字符（2的8次方等于16的2次方））
        char[] resultCharArray =new char[byteArray.length * 2];
        // 遍历字节数组，通过位运算（位运算效率高），转换成字符放到字符数组中去
        int index = 0;
        for (byte b : byteArray) {
           resultCharArray[index++] = hexDigits[b>>> 4 & 0xf];
           resultCharArray[index++] = hexDigits[b& 0xf];
        }
        // 字符数组组合成字符串返回
        return new String(resultCharArray);
	}
	/**
	 * @param filePath
	 * @return 文件名名称，文件后缀,文件大小，文件sha1
	 */
	public String[] getFileInfo(String filePath) {
		log.info("解析文件路劲："+filePath);
		File file  = new File(filePath);
		String[] fileinfo = new String[4];
		if(file.exists()) {
			String fileName = file.getName();
			fileinfo[0] = fileName;
			fileinfo[1] = fileName.substring(fileName.lastIndexOf("."));
			fileinfo[2] = file.length()+"";
			InputStream fileInputStream = null;
			try {
				fileInputStream = new FileInputStream(file);
			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			}
	        int bufferSize = 256 * 1024;
	        DigestInputStream digestInputStream = null;
	        try{
	           // 拿到一个SHA1转换器（这里可以换成MD5）
	           MessageDigest messageDigest =MessageDigest.getInstance("SHA1");
	           // 使用DigestInputStream
	           digestInputStream = new DigestInputStream(fileInputStream,messageDigest);
	           // read的过程中进行SHA1处理，直到读完文件
	           byte[] buffer =new byte[bufferSize];
	           while (digestInputStream.read(buffer) > 0);
	           // 获取最终的MessageDigest
	           messageDigest= digestInputStream.getMessageDigest();
	           // 拿到结果，也是字节数组，包含16个元素
	           byte[] resultByteArray = messageDigest.digest();
	           // 把字节数组转换成字符串
	           fileinfo[3] = byteArrayToHex(resultByteArray);
	        }catch(Exception e) {
	        	fileinfo[3] = "";  
	        }finally{
	           try{
	              digestInputStream.close();
	              fileInputStream.close();
	           }catch (Exception e) {
	           }
	        }
		}
		return fileinfo;
	}
	public static void main(String[] args) {
		String[] fileinfo = getFileInfo("C:\\Users\\mwj\\Desktop\\ebid-20210108100902-mengwenjun.zip");
		for(String str:fileinfo) {
			System.out.println(str);
		}
	}
}
